package negocio.java;

import homes.java.CapturasInfractores;
import homes.java.CategoriasInfractores;
import homes.java.VehiculosInfractores;
import interfaces.AnalizadorImagen;

public class Detector {
		
	private AnalizadorImagen analizadorImagenes;			
	
	private CategoriasInfractores categoriasInfractores;
	private VehiculosInfractores vehiculosInfractores;
	private CapturasInfractores capturasInfractores;
	
	public Detector(AnalizadorImagen analizadorImagen, CategoriasInfractores categoriasInfractores, 
			VehiculosInfractores vehiculosInfractores, CapturasInfractores capturasInfractores) {
		
		this.categoriasInfractores = categoriasInfractores;
		this.vehiculosInfractores = vehiculosInfractores;
		this.capturasInfractores = capturasInfractores;						
				
		this.analizadorImagenes = analizadorImagen;		
	}
	
	/**
	 * Obtiene una captura del analizador de imagenes y la procesa.
	 * En caso de fallo la agrega a la cola de capturas
	 * @param captura
	 */
	public void tomarCaptura(Captura captura){
	 
    /* El sistema externo intenta detectar la patente, sino puede arroja excepcion*/
		try {
			String patente = this.analizadorImagenes.getPatente(captura.getFoto());											
			this.procesarCaptura(captura, patente);
		}
		/* Sino agrego la captura a la cola de pendientes */
		catch (PatenteNoDetectadaException ex) {
			this.capturasInfractores.addPendiente(captura);
		}
	}

	/**
	 * Permite el ingreso manual de patentes
	 * @param patente
	 */
	public void ingresarPatenteManual(Captura captura, String patente){
		this.procesarCaptura(captura, patente);
		this.capturasInfractores.remove(captura);
		
	}
	/**
	 * Obtiene el vehiculo correspondiente a la captura,
	 * le agrega la infracción, evalua si es necesario agregarlo 
	 * a una nueva categoria y/o enviar notificaciones.  
	 * @param captura
	 * @param patente
	 */
	private void procesarCaptura(Captura captura, String patente){
		
		Vehiculo vehiculo = vehiculosInfractores.getVehiculoByPatente(patente);
		captura.setVehiculo(vehiculo);
			
		vehiculo.addInfraccion(captura.getInfraccion());
		
		/* También se debe comprobar si es necesario agregar el vehículo en una nueva categoria */
		for (Categoria categoria : this.categoriasInfractores.getAll()){
			categoria.procesarVehiculo(vehiculo);
		}
		
		/* Cada vez que se obtiene una patente se debe notificar según la categoría del vehículo */
		for (Categoria categoria : vehiculo.getCategorias()) {
			categoria.notificar(captura);
		}			
	}	
	
}
